#ifndef TERMINO_MERGE_H
#define TERMINO_MERGE_H

#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

#include "abb_avl.h"

#define LONG_REGISTRO = 16;
/** ***********							*********** **
 ** ***********	FUNCIONES AUXILIARES	*********** **
 ** ***********							*********** **/	

/*
 * Funcion auxiliar para incrementar enteros con puntero.
 * No devuelve nada.
 */
void incrementar_entero(int* entero,int cantidad);

/** ***********									*********** **
 ** ***********	DEFINICION DEL TIPO DE DATOS	*********** **
 ** ***********									*********** **/	

/*
 * Estructura auxiliar contenedora del string del termino
 * y las apariciones en cada documento, necesaria para la comparación
 * y actualización de datos en distintos archivos.
 */
typedef struct termino_merge termino_merge_t;

/*
 * Crea un nuevo termino a partir del string recibido por parámetro.
 * Actualiza su tamanio y crea su AVL. Lo devuelve al terminar
 * de hacer esto.
 */
termino_merge_t* termino_merge_crear(char* string);

/*
 * Destruye el término recibido por parámetro.
 */
void termino_merge_destruir(termino_merge_t* term);

/*
 * Agrega las apariciones del termino recibido en el documento recibido.
 * Actualiza el tamanio que ocupa el término en memoria.
 */
void termino_merge_agregar_apariciones(termino_merge_t* term,char* documento,int apariciones);

/*
 * Devuelve el AVL de Documento-Apariciones del termino
 * recibido.
 */
abb_avl_t* termino_merge_obtener_apariciones(termino_merge_t* term);

/*
 * Devuelve la cantidad de apariciones del termino recibido
 * en el documento recibido. Devuelve -1 si no recibe documento.
 * Devuelve 0 si el término no aparece en el documento.
 */
int termino_merge_obtener_apariciones_en(termino_merge_t* term,char* documento);

/*
 * Devuelve el tamanio del término recibido por parámetro.
 */
int termino_merge_ver_tamanio(termino_merge_t* term);

/*
 * Devuelve el id del termino;
 */
int termino_merge_obtener_id(termino_merge_t* term);

/*
 * Devuelve el string asociado a un término.
 */
char* termino_merge_obtener_string(termino_merge_t* term);

/*
 * Setea el id del termino recibido al valor recibido.
 */
void termino_merge_set_id(termino_merge_t* term, int id);

/*
 * Combina dos términos de igual nombre en uno solo.
 * Recibe un término fuente y uno destino, en el cual se copiarán
 * las apariciones de los documentos.
 */
void combinar_terminos(termino_merge_t* destino,termino_merge_t* fuente);

/*
 * Vuelca el avl a un subarchivo, con el formato que discutimos (termino,repeticiones).
 */
int escribir_termino_merge_a_archivo(FILE* destino, termino_merge_t* term);

/*
 * Formato del archivo indice (punteros):
 * 		numero_de_termino,posicion_del_termino_en_archivo\n
 * 
 * Formato del archivo de terminos:
 * 		string_termino,string_siguiente_termino,...,string_ultimo_termino,
 * 
 * Devuelve la posicion en la que empezaria el siguiente termino luego
 * del que se acaba de ingresar.
 */
unsigned long int escribir_termino_a_indice(FILE* indice,FILE* archivo_terminos,termino_merge_t* term,unsigned long int numero_termino,unsigned long int ultima_posicion);

#endif // TERMINO_MERGE_H

